const { RestaurantModel, CityModel } = require('../../models/index')
const { Op } = require('sequelize')


// 获取餐厅总数
const getRestaurantCount = async (req, res) => {
  try {
    const RestaurantCountValue = await RestaurantModel.count()

    // 统计成功返回响应
    res.status(200).json({
      title: '餐厅总数',
      data: RestaurantCountValue
    })

  } catch (error) {
    res.status(500).json({ error: error.message })
  }
}

// 获取餐厅列表信息
const getRestaurantList = async (req, res) => {
  try {
    // 从分页中间件中获取分页信息
    const { offset, pageSize } = req.pagination;

    const restaurantList = await RestaurantModel.findAndCountAll({
      attributes: ['restaurant_id', 'name', 'images', 'price', 'rating', 'type', 'is_hot'],
      include: [
        {
          model: CityModel,
          as: 'restaurant_locatedCity',
          attributes: ['name']
        }
      ],
      order: [
        ['updatedAt', 'DESC'],
        ['createdAt', 'DESC']
      ],
      offset: offset,
      limit: parseInt(pageSize, 10)
    })

    // 将数据转化为前端期望的格式
    const formData = {
      count: restaurantList.count,
      rows: restaurantList.rows.map(item => {
        return {
          id: item.restaurant_id,
          name: item.name,
          image: item.images.map((item) => item.url),
          price: item.price,
          rating: item.rating,
          grade: item.grade,
          type: item.type,
          is_hot: item.is_hot,
          city: item.restaurant_locatedCity.name
        }
      })
    }

    res.status(200).json({
      title: '餐厅列表信息',
      data: formData
    })

  } catch (error) {
    res.status(500).json({ error: error.message })
  }
}

// 餐厅列表搜索功能
const searchRestaurant = async (req, res) => {
  try {
    // 获取用户输入的搜索词
    const searchText = req.query.data

    // 如果搜索词为空返回空数组
    if (!searchText || searchText.trim() === '') {
      return res.status(200).json([])
    }

    // 搜索匹配内容
    const restaurantItem = await RestaurantModel.findAll({
      include: [
        {
          model: CityModel,
          as: 'restaurant_locatedCity',
          attributes: ['name']
        }
      ],
      where: {
        [Op.or]: [
          { name: { [Op.like]: `%${searchText}%` } },
          { price: { [Op.like]: `%${searchText}%` } },
          { rating: { [Op.like]: `%${searchText}%` } },
          { type: { [Op.like]: `%${searchText}%` } },
          { '$restaurant_locatedCity.name$': { [Op.like]: `%${searchText}%` } }
        ]
      }
    })

    // 将数据转化为前端期望的格式
    const formData = restaurantItem.map(item => {
      return {
        id: item.scenery_id,
        name: item.name,
        image: item.images.map((item) => item.url),
        price: item.price,
        rating: item.rating,
        type: item.type,
        is_hot: item.is_hot,
        city: item.restaurant_locatedCity.name
      }
    })

    // 返回查询结果
    return res.status(200).json({
      title: '搜索成功',
      data: formData
    })
  } catch (error) {
    res.status(500).json({ error: error.message })
  }
}

// 餐厅热门状态切换
const toggleHotRestaurant = async (req, res) => {
  try {
    // 获取餐厅ID
    const id = req.params.id

    if (!id) {
      return res.status(400).json({ error: '餐厅ID不能为空！' })
    }

    const hotRestaurant = await RestaurantModel.findByPk(id)

    // 餐厅不存在的情况
    if (!hotRestaurant) {
      return res.status(400).json({ error: '餐厅不存在！' })
    }

    // 切换餐厅热门状态
    await hotRestaurant.update({ is_hot: !hotRestaurant.is_hot })

    // 返回成功响应
    res.status(200).json({
      title: '切换成功',
      message: '餐厅热门状态切换成功！'
    })
  } catch (error) {
    res.status(500).json({ error: error.message })
  }
}

// 删除餐厅
const deleteRestaurant = async (req, res) => {
  try {
    // 获取餐厅ID
    const id = req.params.id

    const result = await RestaurantModel.destroy({
      where: {
        restaurant_id: id
      }
    })

    // 检查是否有记录被删除
    if (result === 0) {
      return res.status(404).json({ error: '没有找到需要删除的餐厅记录！' })
    }

    // 删除成功后返回响应
    res.status(200).json({
      title: '删除成功',
      message: '餐厅记录已被成功删除!',
      data: result
    })
  } catch (error) {
    res.status(500).json({ error: error.message })
  }
}

// 发布餐厅
const publishRestaurantData = async (req, res) => {
  try {
    // 获取餐厅ID
    const id = req.body.restaurant_id

    // 获取上传的餐厅数据
    const data = req.body

    // 如果餐厅ID存在则进行修改餐厅信息操作，否则就进行新建发布餐厅信息操作
    if (id) {
      const RestaurantItem = await RestaurantModel.findByPk(id)

      // 未找到餐厅的情况
      if (!RestaurantItem) {
        return res.status(404).json({ error: '未找到需要修改的餐厅信息！' })
      }

      // 找到餐厅后修改信息
      const updateRestaurant = await RestaurantItem.update(data)

      // 返回修改成功的响应
      res.status(200).json({
        title: '修改餐厅信息成功',
        data: updateRestaurant.id
      })
    } else {
      const publishNewRestaurant = await RestaurantModel.create(data)
      // 返回创建成功的响应
      res.status(200).json({
        title: '发布餐厅成功',
        data: publishNewRestaurant.id
      })
    }
  } catch (error) {
    res.status(500).json({ error: error.message })
  }
}

module.exports = {
  getRestaurantCount,
  getRestaurantList,
  searchRestaurant,
  toggleHotRestaurant,
  deleteRestaurant,
  publishRestaurantData
}